using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes.DomainAttributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Enums;
using System.Collections.Generic;
using System.ComponentModel;

namespace Baci.ArcGIS._AviationTools._Airports._ObstructionIdentificationSurfaces
{
    /// <summary>
    /// <para>Light Signal Clearance Surface</para>
    /// <para>Creates a Light Signal Clearance Surface (LSCS) based on the FAA Engineering Brief (EB) 95.</para>
    /// <para>根据 FAA 工程简报 （EB） 95 创建光信号间隙表面 （LSCS）。</para>
    /// </summary>    
    [DisplayName("Light Signal Clearance Surface")]
    public class LightSignalClearanceSurface : AbstractGPProcess
    {
        /// <summary>
        /// 无参构造
        /// </summary>
        public LightSignalClearanceSurface()
        {

        }

        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="_in_features">
        /// <para>Input Runway Features</para>
        /// <para>The input runway dataset. The feature class must be z-enabled and contain polylines.</para>
        /// <para>输入跑道数据集。要素类必须启用 z 并包含折线。</para>
        /// </param>
        /// <param name="_target">
        /// <para>Target OIS Features</para>
        /// <para>The target feature class that will contain the generated obstruction identification surfaces.</para>
        /// <para>将包含生成的障碍物识别表面的目标要素类。</para>
        /// </param>
        public LightSignalClearanceSurface(object _in_features, object _target)
        {
            this._in_features = _in_features;
            this._target = _target;
        }
        public override string ToolboxName => "Aviation Tools";

        public override string ToolName => "Light Signal Clearance Surface";

        public override string CallName => "aviation.LightSignalClearanceSurface";

        public override List<string> AcceptEnvironments => [];

        public override object[] ParameterInfo => [_in_features, _target, _runway_direction.GetGPValue(), _length, _divergence, _slope, _distance_from_threshold, _first_papi_light, _last_papi_light, _start_height, _derived_outfeatureclass, _airport_control_point_feature_class, _surface_position.GetGPValue()];

        /// <summary>
        /// <para>Input Runway Features</para>
        /// <para>The input runway dataset. The feature class must be z-enabled and contain polylines.</para>
        /// <para>输入跑道数据集。要素类必须启用 z 并包含折线。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input Runway Features")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _in_features { get; set; }


        /// <summary>
        /// <para>Target OIS Features</para>
        /// <para>The target feature class that will contain the generated obstruction identification surfaces.</para>
        /// <para>将包含生成的障碍物识别表面的目标要素类。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Target OIS Features")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _target { get; set; }


        /// <summary>
        /// <para>Runway Direction</para>
        /// <para><xdoc>
        ///   <para>Specifies the end of the runway where the approach surface will be created.</para>
        ///   <bulletList>
        ///     <bullet_item>High Runway End Designator— The approach surface will be created at the high end of the runway. This is the default.</bullet_item><para/>
        ///     <bullet_item>Low Runway End Designator—The approach surface will be created at the low end of the runway.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定将在其中创建进近面的跑道尽头。</para>
        ///   <bulletList>
        ///     <bullet_item>高跑道末端指示符 — 进近面将在跑道的高端创建。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>低跑道末端指示符 - 进近面将在跑道的低端创建。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Runway Direction")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _runway_direction_value _runway_direction { get; set; } = _runway_direction_value._HIGH_RUNWAY_END_DESIGNATOR;

        public enum _runway_direction_value
        {
            /// <summary>
            /// <para>High Runway End Designator</para>
            /// <para>High Runway End Designator— The approach surface will be created at the high end of the runway. This is the default.</para>
            /// <para>高跑道末端指示符 — 进近面将在跑道的高端创建。这是默认设置。</para>
            /// </summary>
            [Description("High Runway End Designator")]
            [GPEnumValue("HIGH_RUNWAY_END_DESIGNATOR")]
            _HIGH_RUNWAY_END_DESIGNATOR,

            /// <summary>
            /// <para>Low Runway End Designator</para>
            /// <para>Low Runway End Designator—The approach surface will be created at the low end of the runway.</para>
            /// <para>低跑道末端指示符 - 进近面将在跑道的低端创建。</para>
            /// </summary>
            [Description("Low Runway End Designator")]
            [GPEnumValue("LOW_RUNWAY_END_DESIGNATOR")]
            _LOW_RUNWAY_END_DESIGNATOR,

        }

        /// <summary>
        /// <para>Length</para>
        /// <para>The length of the surface in miles. The default value is 8.</para>
        /// <para>表面的长度（以英里为单位）。默认值为 8。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Length")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public double _length { get; set; } = 8;


        /// <summary>
        /// <para>Divergence</para>
        /// <para>The divergence of the surface in degrees. The default value is 14.</para>
        /// <para>表面的发散度（以度为单位）。默认值为 14。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Divergence")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public double _divergence { get; set; } = 14;


        /// <summary>
        /// <para>Slope</para>
        /// <para>The slope of the surface in degrees. The default value is 1.</para>
        /// <para>曲面的坡度（以度为单位）。默认值为 1。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Slope")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public double _slope { get; set; } = 1;


        /// <summary>
        /// <para>Distance From Threshold</para>
        /// <para>The distance from the threshold in feet. The default value is 1000.</para>
        /// <para>与阈值的距离（以英尺为单位）。默认值为 1000。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Distance From Threshold")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public double _distance_from_threshold { get; set; } = 1000;


        /// <summary>
        /// <para>First PAPI Light</para>
        /// <para>The location of the first precision approach path indicator. The default value is 60.</para>
        /// <para>第一个精度进近路径指示器的位置。默认值为 60。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("First PAPI Light")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public double _first_papi_light { get; set; } = 60;


        /// <summary>
        /// <para>Last PAPI Light</para>
        /// <para>The location of the last precision approach path indicator. The default value is 120.</para>
        /// <para>最后一个精度进近路径指示器的位置。默认值为 120。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Last PAPI Light")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public double _last_papi_light { get; set; } = 120;


        /// <summary>
        /// <para>Start Height</para>
        /// <para>The start height of the surface. The default value is 35.</para>
        /// <para>曲面的起始高度。默认值为 35。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Start Height")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public double _start_height { get; set; } = 35;


        /// <summary>
        /// <para>Output OIS Features</para>
        /// <para></para>
        /// <para></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output OIS Features")]
        [Description("")]
        [Option(OptionTypeEnum.derived)]
        public object _derived_outfeatureclass { get; set; }


        /// <summary>
        /// <para>Input Airport Control Point Feature</para>
        /// <para>Supplies x-, y-, and z-geometry for displaced threshold features. If displaced thresholds are included, surfaces will be constructed based on their x-, y-, and z-geometry instead of their corresponding runway feature endpoint.</para>
        /// <para>为位移阈值特征提供 x、y 和 z 几何。如果包含位移阈值，则将基于其 x、y 和 z 几何构建表面，而不是其相应的跑道要素端点。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input Airport Control Point Feature")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _airport_control_point_feature_class { get; set; } = null;


        /// <summary>
        /// <para>Surface Position</para>
        /// <para><xdoc>
        ///   <para>Specifies the position of the precision approach path indicator (PAPI) lights on either side of a runway. The position of the PAPI lights will be used to determine the position of the output surface.</para>
        ///   <bulletList>
        ///     <bullet_item>Generate surface on left approach side of the runway—PAPI lights are on the left approach side of the runway. The surface will generate on the left approach side of the runway. This is the default.</bullet_item><para/>
        ///     <bullet_item>Generate surface on right approach side of the runway—PAPI lights are on the right approach side of the runway. The surface will generate on the right approach side of the runway.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定跑道两侧精确进近路径指示器 （PAPI） 灯的位置。PAPI 灯的位置将用于确定输出表面的位置。</para>
        ///   <bulletList>
        ///     <bullet_item>在跑道的左侧进近侧生成表面 - PAPI 灯位于跑道的左侧进近侧。表面将在跑道的左侧进近侧生成。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>在跑道的右侧进近侧生成表面 - PAPI 灯位于跑道的右侧进近侧。表面将在跑道的右侧进近侧生成。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Surface Position")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _surface_position_value _surface_position { get; set; } = _surface_position_value._SURFACE_GENERATED_ON_LEFT;

        public enum _surface_position_value
        {
            /// <summary>
            /// <para>Generate surface on left approach side of the runway</para>
            /// <para>Generate surface on left approach side of the runway—PAPI lights are on the left approach side of the runway. The surface will generate on the left approach side of the runway. This is the default.</para>
            /// <para>在跑道的左侧进近侧生成表面 - PAPI 灯位于跑道的左侧进近侧。表面将在跑道的左侧进近侧生成。这是默认设置。</para>
            /// </summary>
            [Description("Generate surface on left approach side of the runway")]
            [GPEnumValue("SURFACE_GENERATED_ON_LEFT")]
            _SURFACE_GENERATED_ON_LEFT,

            /// <summary>
            /// <para>Generate surface on right approach side of the runway</para>
            /// <para>Generate surface on right approach side of the runway—PAPI lights are on the right approach side of the runway. The surface will generate on the right approach side of the runway.</para>
            /// <para>在跑道的右侧进近侧生成表面 - PAPI 灯位于跑道的右侧进近侧。表面将在跑道的右侧进近侧生成。</para>
            /// </summary>
            [Description("Generate surface on right approach side of the runway")]
            [GPEnumValue("SURFACE_GENERATED_ON_RIGHT")]
            _SURFACE_GENERATED_ON_RIGHT,

        }

        public LightSignalClearanceSurface SetEnv()
        {
            base.SetEnv();
            return this;
        }

    }

}